#include "qqmusic.h"
#include "ui_qqmusic.h"
#include<QPushButton>
#include<QMouseEvent>
#include<QDebug>
#include<QGraphicsDropShadowEffect>
#include<QJsonObject>
#include<QJsonArray>
#include<QFileDialog>
#include"commonpage.h"
#include<QSystemTrayIcon> //添加系统托盘
#include<QMenu>


QQMusic::QQMusic(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::QQMusic)
    ,currentIndex(-1)
{
    ui->setupUi(this);

    initSqlite();
    initMusicList();

    initUi();

    initPlay();

    connectSignalAndSlots();
}

QQMusic::~QQMusic()
{
    delete ui;
}

void QQMusic::initSqlite()
{
    //1.进行数据库驱动加载
    sqlite = QSqlDatabase::addDatabase("QSQLITE");

    //2.设置数据库名称
    sqlite.setDatabaseName("QQMusic.db");

    //3.打开
    if(!sqlite.open())
    {
        QMessageBox::critical(this,"QQMusic","数据库打开失败");  //critical--错误信息
        return;
    }
    qDebug()<<"QQMsuic数据库连接成功";

    //4.创建表
    QString sql = "create table if not exists MusicInfo(\
                    id integer primary key autoincrement,\
                    musicId varchar(50) unique,\
                    musicName varchar(50),\
                    musicSinger varchar(50),\
                    albumnName varchar(50),\
                    musicUrl varchar(256),\
                    duration bigint,\
                    isLike integer,\
                    isHistory integer)";

     QSqlQuery query;
     if(!query.exec(sql))
     {
         QMessageBox::critical(this,"QQMusic","初始化错误！！！");
         return;
     }
     qDebug()<<"QQMusic表创建成功";


}

void QQMusic::initMusicList()
{
    musicList.readFromQQMusicDB();

    ui->likePage->setMusicListType(PageType::LIKE_PAGE);
    ui->likePage->reFresh(musicList);

    ui->localPage->setMusicListType(PageType::LOCAL_PAGE);
    ui->localPage->reFresh(musicList);

    ui->recentPage->setMusicListType(PageType::HISTORY_PAGE);
    ui->recentPage->reFresh(musicList);

}

void QQMusic::initUi()
{
    //设置窗口没有标题栏
    this->setWindowFlag(Qt::FramelessWindowHint);

    //设置窗口背景透明
    setAttribute(Qt::WA_TranslucentBackground,true); //设置窗口属性  背景 ，透明

    //设置窗口图标
    setWindowIcon(QIcon(":/images/tubiao.png"));

    //禁止最大化按钮
    ui->max->setEnabled(false);

    //设置添加系统托盘
    QSystemTrayIcon* trayIcon = new QSystemTrayIcon(this);
    trayIcon->setIcon(QIcon(":/images/tubiao.png"));
    trayIcon->show();
    //给托盘添加菜单
    QMenu* trayMenu = new QMenu();
    trayMenu->addAction("显示", this, &QWidget::showNormal);
    trayMenu->addAction("退出", this, &QQMusic::onQQMusicQuit);
    //菜单设置到托盘
    trayIcon->setContextMenu(trayMenu);
    // 假设主窗口类为 QQMusic（或其他自定义类），trayIcon 是已初始化的 QSystemTrayIcon 对象

    // 连接托盘图标的 activated 信号到处理函数
    connect(trayIcon, &QSystemTrayIcon::activated, this, &QQMusic::onTrayIconActivated);





    //设置窗口阴影效果
    QGraphicsDropShadowEffect* shadowEffect = new QGraphicsDropShadowEffect(this);//父元素是QQMusic,挂在对象树上
    shadowEffect->setOffset(0,0); //设置阴影的偏移量为 (0, 0)
    shadowEffect->setColor("#000000"); // 黑色
    shadowEffect->setBlurRadius(10); //设置阴影圆角
    this->setGraphicsEffect(shadowEffect); //设置添加该阴影


    //设置btForm 图标Icon和文本Text
    ui->recomment->setIconAndText(":/images/rec.png","推荐",0);
    ui->audio->setIconAndText(":/images/radio.png","电台",1);
    ui->music->setIconAndText(":/images/music.png","音乐馆",2);
    ui->like->setIconAndText(":/images/like.png","我喜欢",3);
    ui->local->setIconAndText(":/images/local.png","本地下载",4);
    ui->recent->setIconAndText(":/images/recent.png","最近播放",5);



    //将localPage设置为当前页面
    ui->stackedWidget->setCurrentIndex(4);
    //将localPage设置为 默认播放的页面
    currentPage = ui->localPage;

    //运行程序后 本地下载(local) btForm动画默认先显示
    ui->local->showAnimal(true);    //ui->local->linebox->show() btform中找不到linebox btform的ui中是私有，QQmusic不能访问,


    //初始化RecBox推荐页面
    srand(time(NULL));//设置随机种子
    ui->recMusicBox->initRecBoxUi(randomPiction(),1); // //randomPiction()这个是可以得到QJsonArray 所有的推荐图片路径和文本
    ui->supplyMusicBox->initRecBoxUi(randomPiction(),2);

    //初始化设置CommonPage的信息
    //ui->likePage->setMusicListType(PageType::LIKE_PAGE);
    ui->likePage->setCommonPageUi("我喜欢",":/images/ilikebg.png");
    //ui->localPage->setMusicListType(PageType::LOCAL_PAGE);
    ui->localPage->setCommonPageUi("本地音乐",":/images/localbg.png");
    //ui->recentPage->setMusicListType(PageType::HISTORY_PAGE);
    ui->recentPage->setCommonPageUi("最近播放",":/images/recentbg.png");

    //初始化音量对象
    volumeTool = new VolumeTool(this);

    //播放控制区按钮图标设定
    ui->play->setIcon(QIcon(":/images/play_2.png"));
    //播放模式按钮图标设定 - 列表循环
    ui->playMode->setIcon(QIcon(":/images/order_play.png"));


    //初始化lrc歌词对象
    lrcPage = new LrcPage(this);
    lrcPage->setGeometry(15, 10, lrcPage->width(), lrcPage->height());//lrc窗口对齐主窗口 微调位置
    lrcPage->hide();

    //初始化上移动画对象
    lrcPageAnimal = new QPropertyAnimation(lrcPage,"geometry",this);//给lrcPage设置动画 以矩形geometry方式移动
    lrcPageAnimal->setDuration(500);//设置动画时长
    lrcPageAnimal->setStartValue(QRect(15,10+lrcPage->height(),lrcPage->width(),lrcPage->height()));
    lrcPageAnimal->setEndValue(QRect(15,10,lrcPage->width(),lrcPage->height()));
    //这里先不 lrcPageAnimal->start(); 是要在点击按钮后 才启动动画

}

void QQMusic::initPlay()
{
    //1.初始化媒体播放 相关类 的对象
    player = new QMediaPlayer(this);
    //初始化媒体播放列表
    playList = new QMediaPlaylist(this);

    //2.设置默认播放模式
    playList->setPlaybackMode(QMediaPlaylist::Loop);//设置为列表循环

    //3.将播放列表设置添加到播放媒体对象中
    player->setPlaylist(playList);

    //4.设置默认的音量大小 默认设置成20%
    player->setVolume(20);


    //关联QMediaPlayer的信号 -- 播放器的关联在init中 界面的关联在connectSignalAndSlots
    //connect(player,&QMediaPlayer::stateChanged,this,&QQMusic::onPlayerStateChanged);
    //connect(playlist,&QMediaPlaylist::playbackModeChange,this,&QQMusic::onPlaybackModeChanged)

    //当playlist中播放源发生变化时 - 会带参数 没有点击 只能手动connectt
    connect(playList,&QMediaPlaylist::currentIndexChanged,this,&QQMusic::onCurrentIndexChanged);

    //当player媒体源切换时触发的信号  关联QMediaPlayer::durationChanged信号
    connect(player, &QMediaPlayer::durationChanged, this, &QQMusic::onDurationChanged);

    //当player媒体源播放位置改变时触发的信号  关联QMediaPlayer::positionChanged信号
    connect(player,&QMediaPlayer::positionChanged,this,&QQMusic::onPositionChanged);

    //当player媒体元数据 可用性发生 改变时出发的信号 (加载完成,状态改变,可用不可用转变) 关联QMediaPlayer::onMetaDataAvailableChanged
    connect(player, &QMediaPlayer::metaDataAvailableChanged, this, &QQMusic::onMetaDataAvailableChanged);

    //connect(ui->lrcWord, &QPushButton::clicked, this, &QQMusic::onLrcWordClicked);// 歌词按钮点击信号和槽函数
}


QJsonArray QQMusic::randomPiction()//程序执行时就把 需要添加到recBox的所有recBoxItem就初始化好
{
    //推荐文本+推荐图片
    QVector<QString> vecImageName; //先用一个vector装所有图片的名字
    vecImageName<<"001.png"<<"003.png"<<"004.png"<<"005.png"<<"006.png"<<"007.png"   //QString支持流重载<<
                <<"008.png"<<"009.png"<<"010.png"<<"011.png"<<"012.png"<<"013.png"
                <<"014.png"<<"015.png"<<"016.png"<<"017.png"<<"018.png"<<"019.png"
                <<"020.png"<<"021.png"<<"022.png"<<"023.png"<<"024.png"<<"025.png"
                <<"026.png"<<"027.png"<<"028.png"<<"029.png"<<"030.png"<<"031.png"
                <<"032.png"<<"033.png"<<"034.png"<<"035.png"<<"036.png"<<"037.png"
                <<"038.png"<<"039.png"<<"040.png";
    //随机把图片打乱-注意这个只是设置了一个随机种子
    std::random_shuffle(vecImageName.begin(),vecImageName.end());


    //JSON键值对方法(key:value)
    //创建json对象
    //path :  ":/images/rec/" + vecImageName[i]
    //text ： "推荐-001" 推荐顺序和图片顺序不一致

    QJsonArray objArray; //专门保存Json对象的数组
    for(int i=0;i<vecImageName.size();++i) //********************    JsonObject 是(key:JsonValue)
    {
        QJsonObject obj; //一个JSON对象 QJsonObject是json对象的类型
        obj.insert("path",":/images/rec/" + vecImageName[i]);
        QString strText = QString("推荐-%1").arg(i,3,10,QChar('0'));//第i个 以十进制 需占三位数字 如果不够三位 用‘0’填充
        obj.insert("text",strText);
//                              qDebug()<<obj.value("path").toString();   obj.value("path")拿到obj的值 但要toString
//                              qDebug()<<obj.value("text").toString();
        objArray.append(obj);
    }
    return objArray;
}


void QQMusic::connectSignalAndSlots()
{   //QQMusic接收到btForm鼠标按下时的自定义信号
    //关联btForm的信号 和 处理该信号的槽函数
    connect(ui->recomment,&BtForm::btClick,this,&QQMusic::onBtFormClick);
    connect(ui->audio,&BtForm::btClick,this,&QQMusic::onBtFormClick);
    connect(ui->music,&BtForm::btClick,this,&QQMusic::onBtFormClick);
    connect(ui->like,&BtForm::btClick,this,&QQMusic::onBtFormClick);
    connect(ui->local,&BtForm::btClick,this,&QQMusic::onBtFormClick);
    connect(ui->recent,&BtForm::btClick,this,&QQMusic::onBtFormClick);

    //收藏或不收藏处理
    connect(ui->likePage,&CommonPage::updateLikeMusic,this,&QQMusic::updateLikeMusicAndPage);
    connect(ui->localPage,&CommonPage::updateLikeMusic,this,&QQMusic::updateLikeMusicAndPage);
    connect(ui->recentPage,&CommonPage::updateLikeMusic,this,&QQMusic::updateLikeMusicAndPage);

    // 播放控制区的信号和槽函数关联（手动连接时，但可以直接转到槽）
    //connect(ui->play, &QPushButton::clicked, this, &QQMusic::onPlayMusic);
    //connect(ui->playUp,&QPushButton::clicked,this,%QQMusic::onPlayUpClicked);
    //connect(ui->playDown,&QPushButton::clicked,this,%QQMusic::onPlayDownClicked);
    //connect(ui->playMode,&QPushButton::clicked,this,&QQMusic::onPlaybackModeClicked);

    //这个连接的是 接收commonPage发送的信号 对应的处理槽函数 likepage localpage recentpage都是CommonPage类 都有“播放所有”按钮 ，
    connect(ui->likePage,&CommonPage::playAll,this,&QQMusic::onPlayAll);
    connect(ui->localPage,&CommonPage::playAll,this,&QQMusic::onPlayAll);
    connect(ui->recentPage,&CommonPage::playAll,this,&QQMusic::onPlayAll);

    // 处理likePage、localPage、recentPage中ListItemBox双击
    connect(ui->likePage, &CommonPage::playMusicByIndex, this, &QQMusic::playMusicByIndex);
    connect(ui->localPage, &CommonPage::playMusicByIndex, this, &QQMusic::playMusicByIndex);
    connect(ui->recentPage, &CommonPage::playMusicByIndex, this, &QQMusic::playMusicByIndex);

    //处理是否静音 volumetool中点击"静音按钮"后发送过来的信号 关联槽函数
    connect(volumeTool,&VolumeTool::setMusicMuted,this,&QQMusic::setPlayerMuted);

    //处理设置音量大小 volumetool中 按下,抬起,移动鼠标"静音按钮"后发送过来的信号 关联槽函数
    connect(volumeTool,&VolumeTool::setMusicVolume,this,&QQMusic::setPlayerVolume);

    //处理设置 进度条位置改变时     发送过来的信号 关联槽函数 现在是想要 点击进度条位置改变后 修改其播放时间(播放位置也要修改)
    connect(ui->progressBar,&MusicSlider::setMusicSliderPositon,this,&QQMusic::onMusicsliderChanged);

    //
}

void QQMusic::updateBtformAnimal() //点击哪个btform时，动画效果在上面 其他隐藏
{
    // 获取currentPage在stackedWidget中的索引
    int index = ui->stackedWidget->indexOf(currentPage);
    if(-1 == index)
    {
        qDebug()<<"该页面不存在";
        return;
    }

    // 获取QQMusci界面上所有的btForm
    QList<BtForm*> btForms = this->findChildren<BtForm*>();
    for(auto btForm : btForms)
    {
        if(btForm->getPageId() == index)
        {
            // 将currentPage对应的btForm找到了
            btForm->showAnimal(true);
        }
        else
        {
            btForm->showAnimal(false);
        }
    }
}


//托盘中
void QQMusic::onQQMusicQuit()
{
    // 歌曲信息写入数据库
    musicList.writeToQQMusicDB();
    // 断开与SQLite的链接
    sqlite.close();
    close();
}

// 双击托盘
void QQMusic::onTrayIconActivated(QSystemTrayIcon::ActivationReason reason)
{
    // 判断是否为双击事件
    if (reason == QSystemTrayIcon::DoubleClick) {
        // 显示主窗口（从最小化/隐藏状态恢复）
        this->showNormal(); // showNormal() 确保窗口恢复为正常大小，而非最小化
        this->raise(); // 置顶窗口（可选，确保用户能立即看到）
        this->activateWindow(); // 激活窗口（获取焦点，可选）
    }
}


void QQMusic::onBtFormClick(int pageId) //handle,处理信号槽函数方法
{
    //清除之前btForm按钮的背景颜色

    //先要获取到所有btForm按钮
    QList<BtForm*> btFormList = this->findChildren<BtForm*>();//找所以BtForm类型的控件 存储在 QList<BtForm *> 类型的 btFormList 列表中。
    for(auto btForm:btFormList) //循环遍历 btFormList 中的每个 BtForm 按钮
    {
        if(btForm->getPageId()!=pageId)
        {
            btForm->clearBackground();
        }
    }

    //切换page页面
    ui->stackedWidget->setCurrentIndex(pageId);
    qDebug()<<"切换到页面"<<pageId<<endl;

       isDrag = false; //防止点击btform按钮时拖拽
}

void QQMusic::updateLikeMusicAndPage(bool isLike, const QString &musicId)
{
    //1.修改状态
    auto it = musicList.findMusicByMusicId(musicId);
    if(it != musicList.end())
    {
        it->setIsLike(isLike);
    }
    //2.更新Page页面歌曲列表
    ui->likePage->reFresh(musicList);
    ui->localPage->reFresh(musicList);
    ui->recentPage->reFresh(musicList);

}


void QQMusic::on_quit_clicked()
{
    //想要点击关闭 只是隐藏起来 在托盘中彻底关闭
    hide();
}


void QQMusic::mouseMoveEvent(QMouseEvent *event)
{
    if(Qt::LeftButton==event->buttons() && isDrag == true) //左键按下且可以拖拽时 才可以移动
    {
        move(event->globalPos() - dragPosition); //获取鼠标在全局坐标系中的位置 减去 dragPosition 鼠标按下事件中记录的鼠标相对于窗口的位置偏移
        qDebug()<<"move"<< endl; event->globalPos();//得到窗口新的位置，然后通过 move 函数移动窗口
        return;
    }
    QWidget::mouseMoveEvent(event);//如果不是鼠标左键按下的情况，就调用父类（QWidget）的 mouseMoveEvent 函数，执行父类对鼠标移动事件的默认处理
}

void QQMusic::mousePressEvent(QMouseEvent *event)
{
    if(Qt::LeftButton==event->button())
    {
        isDrag = true; //窗口中左键点击按下 允许推拽

        //获取鼠标相当于屏幕左上角的全局坐标
        dragPosition = event->globalPos() - geometry().topLeft();       //屏幕左上角 - 窗口左上角
        return;
    }
    QWidget::mousePressEvent(event);
}

//volume按钮的槽函数- 想要 点击volume按钮 就会显示 弹出窗口volumeTool
void QQMusic::on_volume_clicked()
{
    //1.获取ui->volume控件(音量键)的左上角left-top坐标,并转换为全局坐标             然后获取()       不然弹出位置是全局坐标
    QPoint point = ui->volume->mapToGlobal(QPoint(0,0));
    //2.ui->volume控件(音量键)的左上角的全局坐标 减去 volumetool的长和宽 得到 最终volumetool弹窗出现的位置
    QPoint volumeLeftTop = point - QPoint(volumeTool->width()/2,volumeTool->height()); // 除以2是因为需要放在正上方偏左一点
   //3.设置移动VolumeTool弹窗
    //发现弹窗在音量键 左上方 需要调整 调整完再move
    volumeLeftTop.setX(volumeLeftTop.x()+15);
    volumeLeftTop.setY(volumeLeftTop.y()+30);
    volumeTool->move(volumeLeftTop);
    //4.显示窗口
    volumeTool->show();
}

void QQMusic::on_addLocal_clicked()
{
    //创建一个文件对话窗
    QFileDialog filedialog(this);

    //设置文件对话框窗口标题
    filedialog.setWindowTitle("添加本地下载音乐");

    //设置文件对话框默认打开路径
    QDir dir(QDir::currentPath());
    dir.cdUp();//进入上一目录
    QString projectPath = dir.path();
    projectPath += "/QQMusic/musics";

    qDebug()<<projectPath;
    filedialog.setDirectory(projectPath);

    //设置文件选择模式 ：一次可以选择打开多个
    filedialog.setFileMode(QFileDialog::ExistingFiles);

    //设置文件过滤器 - 通过文件后缀过滤
    //filedialog.setNameFilter("代码文件(*.h *.c *.hpp *cpp)");//空格隔开
    //filedialog.setNameFilter("图片文件(*.png *.bmp *.jpg )");//这样设置多个过滤器 只会有一个生效

    //通过文件的MIME类型来过滤
    QStringList mimeTypeFilters;
    //mimeTypeFilters << "image/png";     // 过滤出"PNG image (*.png)"
                                         //<< "image/jpeg";   // 过滤出"JPEG image (*.jpeg *.jpg *.jpe)
    mimeTypeFilters << "application/octet-stream";//但是现在 通用的二进制流的方式 过滤* 及全部显示出来
    filedialog.setMimeTypeFilters(mimeTypeFilters);

    //显示(文件弹窗显示后 想要当选择某些文件点击打开后 获取到其文件路径)
    if(QDialog::Accepted==filedialog.exec())
    {
        //获取选中的文件
        QList<QUrl> fileUrls = filedialog.selectedUrls();//创建一个QList<QUrl>对象fileUrls 来接收 内部放的是刚刚 选中的某些文件的Url路径
        //现在已经拿到所有音乐的url路径在fileUrls中

        //选择需要把添加到 本地下载

        //每个音乐是一个music对象 将所有音乐都添加到音乐列表MusicList 管理起来 此时的music是解析之后的music对象
        musicList.addMusicsByUrl(fileUrls);

        //将commonPage切换到 本地下载 页面
        ui->stackedWidget->setCurrentIndex(4);
        //将歌曲信息更新到commonPage中的listWidget中 但是commonPage又包括了localPage likePage recentPage三个页面都叫commonPage 所以要分类
        ui->localPage->reFresh(musicList);


        // 将localPage中的歌曲添加到媒体播放列表中
        ui->localPage->addMusicToPlaylist(musicList, playList);
    }

}


/***********************************************************************************************************/
//播放控制说明

//播放和暂停
//void QQMusic::onPlayMusic()
//{
//    //1.添加媒体源
//    player->setMedia(musicList.begin()->getMusicUrl()); //参数要QMediaContent 但可以直接传music的Qurl
//    //2.播放
//    player->play();
//    ......
//}

void QQMusic::on_play_clicked() //点击中间的"播放"按钮
{
    //1.添加媒体源
    //player->setMedia(musicList.begin()->getMusicUrl()); //参数要QMediaContent 但可以直接传music的Qurl
    //2.播放
    //player->play();

    if(QMediaPlayer::PlayingState == player->state())
    {
        //此时是 播放中 点击后应该暂停
        player->pause();
        ui->play->setIcon(QIcon(":/images/play3.png"));
    }
    else if(QMediaPlayer::PausedState == player->state())
    {
        //此时是 暂停中 点击后应该继续播放
        player->play();
        ui->play->setIcon(QIcon(":/images/play_on.png"));
    }
    else if(QMediaPlayer::StoppedState == player->state())
    {
        //刚开始默认为停止状态，点击后 直接播放即可
        player->play();
        ui->play->setIcon(QIcon(":/images/play_on.png"));
    }
    else
    {
        qDebug()<<player->errorString();
    }
}


//void QQMusic::onPlayerStateChanged()     //间接点击→状态变化→stateChanged 信号→槽函数
//{
//    if(player->state() == QMediaPlayer::PlayingState)
//    {
//        ui->play->setIcon(QIcon(":/images/play_on.png"));
//    }
//    else
//    {
//        ui->play->setIcon(QIcon(":/images/play3.png"));
//    }
//}


void QQMusic::on_playDown_clicked() //点击 "播放下一首" 按钮
{
    playList->next();
}

void QQMusic::on_playUp_clicked() //点击 "播放上一首" 按钮
{
    playList->previous();
}

void QQMusic::on_playMode_clicked() //点击切换"播放模式"按钮
{
    //1.根据当前播放模式，切换到下一个播放模式
    //2.设置ToolTip提示
    //3.列表循环--》随机播放--》单曲循环
    //4.当状态发生改变的时候，还需要修改按钮上的图标

    if(playList->playbackMode() == QMediaPlaylist::Loop)//列表循环
    {
        playList->setPlaybackMode(QMediaPlaylist::Random);//是列表循环，需要点击之后是随机播放
        ui->playMode->setToolTip("随机播放");
        ui->playMode->setIcon(QIcon(":/images/shuffle_2.png"));
    }
    else if(playList->playbackMode() == QMediaPlaylist::Random)
    {
        playList->setPlaybackMode(QMediaPlaylist::CurrentItemInLoop);//是随机播放 ,需要点击之后是单曲循环
        ui->playMode->setToolTip("单曲循环");
        ui->playMode->setIcon(QIcon(":/images/single_play.png"));
    }
    else if(playList->playbackMode() == QMediaPlaylist::CurrentItemInLoop)
    {
        playList->setPlaybackMode(QMediaPlaylist::Loop);//是单曲循环 ,需要点击之后是列表循环
        ui->playMode->setToolTip("列表循环");
        ui->playMode->setIcon(QIcon(":/images/order_play.png"));
    }
    else
    {
        qDebug()<<"暂不支持";
    }
}
//void onPlaybackModeChanged(QMediaPlaylist::PlaybackMode playbackMode)
//{
//    if(playbackMode() == QMediaPlaylist::Loop)
//    {
//        ui->playMode->setIcon(QIcon(":/images/shuffle_2.png"));    //这里不一致是因为 这是信号变换后 变成什么就切换什么图标
//    }
//    else if(playbackMode() == QMediaPlaylist::Random)
//    {
//        ui->playMode->setIcon(QIcon(":/images/single_play.png"));
//    }
//     else if(playbackMode() == QMediaPlaylist::CurrentItemInLoop)
//    {
//        ui->playMode->setIcon(QIcon(":/images/order_play.png"));
//    }
//    else
//    {
//        qDebug()<<"暂不支持";
//    }
//}

void QQMusic::onPlayAll(PageType pageType) //点击CommonPage中的"播放全部"按钮
{
    // 播放page对应的CommonPage页面中的所有歌曲，默认从第0首开始播放
    // 1.先通过pageType找到对应的CommonPage页面
    CommonPage* page = ui->localPage;  //默认page是localPage
    switch(pageType)
    {
    case PageType::LIKE_PAGE:
        page = ui->likePage;
        break;
    case PageType::LOCAL_PAGE:
        page = ui->localPage;
        break;
    case PageType::HISTORY_PAGE:
        page = ui->recentPage;
        break;
    default:
        qDebug()<<"暂不支持的页面";
    } //现在只是找到了页面 就是page

    // 2.此时page中记录的就是要播放的页面 --执行播放方法
    playAllMusicOfCommonPage(page,0); //page从第0首开始播放
}

void QQMusic::playAllMusicOfCommonPage(CommonPage *page, int index) //播放页面中的歌曲
{
    currentPage = page;//现在播放的页面
    updateBtformAnimal();//currentPage变化后就要更新动画播放页面位置

    // 清空之前playList中的歌曲
    playList->clear();
    // 添加当前要播放的page页面中的所有歌曲
    page->addMusicToPlaylist(musicList, playList);
    // 播放从第0首开始播放
    playList->setCurrentIndex(index);
    player->play();
}

//双击后 按索引播放
void QQMusic::playMusicByIndex(CommonPage *page, int index)
{
    playAllMusicOfCommonPage(page,index);
}


//历史播放
void QQMusic::onCurrentIndexChanged(int index)  //历史播放
{
    currentIndex = index; //保存下媒体源音乐的索引 方便之后使用

    // 由于CommonPage页面中的歌曲和正在播放的播放列表中的歌曲的先后次序是相同的
    // 知道歌曲在playlist中的索引之后，直接到CommonPage中获取
    // 注意：playlist中的歌曲就是根据CommonPage中的musicOfPage加载
    QString musicId = currentPage->getMusicIdByIndex(index);
    // 本意是想要通过索引拿到歌曲，然后修改歌曲的isHistory属性
    auto it = musicList.findMusicByMusicId(musicId);
    if(it != musicList.end())
    {
        it->setIsHistory(true);
    }

    ui->recentPage->reFresh(musicList);
}


//媒体设置是否静音
void QQMusic::setPlayerMuted(bool isMuted)
{
    player->setMuted(isMuted);
}

void QQMusic::setPlayerVolume(int volume)
{
    player->setVolume(volume);
}

void QQMusic::onDurationChanged(qint64 duration)
{
     totalTime = duration; //把媒体源总时间记录下来 方便之后的计算

    // duration为歌曲的总时长,单位为毫秒
    // 需要将整形的总时长转换为 min:sec
    // duration/1000/60; 分钟
    // duration/1000%60; 秒
                             //    02:12                        占2位  10进制  填位符'0'
    ui->totalTime->setText(QString("%1:%2").arg(duration/1000/60, 2, 10, QChar('0'))
                           .arg(duration/1000%60, 2, 10, QChar('0'))); //两个位置 连续调用两次arg
}

void QQMusic::onPositionChanged(qint64 position)//播放位置(也是播放时间)改变时 需要同步更新三处
{
    //更新播放的时间 位置
    ui->currentTime->setText(QString("%1:%2").arg(position/1000/60, 2, 10, QChar('0'))
                             .arg(position/1000%60, 2, 10, QChar('0'))); //两个位置 连续调用两次arg


    //更新播放的进度条位置
    ui->progressBar->setStep((float)position/(float)totalTime); //参数position就是一个比率

    //歌词界面同步更新歌词
    if(currentIndex >= 0)  //currentIndex是当前这首歌曲在播放列表中的索引  >=0 说明肯定有歌曲在播放
    {
        lrcPage->showLrcWordLine(position);//参数是 媒体源的 当前播放时间 也是一个位置
    }

}

void QQMusic::onMusicsliderChanged(float ration) //点击进度条 位置改变后 修改其播放时间
{
    //根据进度条与总宽度的比率 来更新当前播放时间
    qint64 duration = totalTime * ration;
    ui->currentTime->setText(QString("%1:%2").arg(duration/1000/60, 2, 10, QChar('0'))
                             .arg(duration/1000%60, 2, 10, QChar('0')));

    //注意这里 时间修改了以后 媒体播放时间也要修改(就是要从点击进度条的位置开始播放)
    player->setPosition(duration);

}

void QQMusic::onMetaDataAvailableChanged(bool available) //这里的参数好像可以不要
{
    (void)available;
    //歌曲名称，歌曲作者 直接到music对象中获取
    //但此时需要知道 媒体源在播放列表的索引 ---- 在onCurrentIndexChanged中保存了媒体源的索引
    QString musicId = currentPage->getMusicIdByIndex(currentIndex);
    auto it = musicList.findMusicByMusicId(musicId);

    QString musicName("未知歌曲");
    QString musicSinger("歌手位置");
    if(it != musicList.end())
    {
        musicName = it->getMusicName();
        musicSinger = it->getMusicSinger();
    }

    ui->musicName->setText(musicName);
    ui->musicSinger->setText(musicSinger);


    // 获取封面图，通过元数据来获取
    QVariant coverimage = player->metaData("ThumbnailImage"); //ThumbnailImage时媒体元数据的缩略图
    if(coverimage.isValid())//如果是有效的,可用的 即coverimage 中确实存储了有效的元数据
    {
        QImage image = coverimage.value<QImage>();  //从 QVariant 类型的 coverimage 中提取 QImage 类型
        ui->musicCover->setPixmap(QPixmap::fromImage(image)); //image转pixmap
        currentPage->setMusicImage(QPixmap::fromImage(image));
    }
    else
    {
        qDebug()<<"歌曲没有封面图";
        // 可以设置默认图片
        QString path = ":/images/rec/001.png";
        ui->musicCover->setPixmap(path);
        currentPage->setMusicImage(path);
    }
    ui->musicCover->setScaledContents(true); //自动适应调整


    //解析歌曲lrc歌词
    if(it != musicList.end())
    {
        //获取lrc歌词文件的路径
        QString lrcPath = it->getLrcFilePath();

        //解析lrc歌词文件
        lrcPage->parseLrcFile(lrcPath);

    }
}


void QQMusic::on_lrcWord_clicked()
{
    lrcPage->show();
    lrcPageAnimal->start();
}



void QQMusic::on_skin_clicked()
{
    // 换肤
    // 类似：给窗口更新背景颜色 或者 更换背景图片
    QMessageBox::information(this, "温馨提示", "换肤功能小哥哥正在紧急支持中...");
}

void QQMusic::on_max_clicked()
{
    this->showMaximized();
}

void QQMusic::on_min_clicked()
{
    this->showMinimized();
}
